package com.example.zz.example.pattern.proxy;

import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;

import com.example.zz.example.R;
import com.example.zz.example.pattern.proxy.staticproxy.Image;
import com.example.zz.example.pattern.proxy.staticproxy.ImageInterface;
import com.example.zz.example.pattern.proxy.staticproxy.ImageProxy;

/**
 * 代理模式：为其他对象提供一种代理以控制对这个对象的访问
 * 代理模式的主要特点：
 * 1、代理对象和被代理对象都实现同一个接口
 * 2、代理对象持有被代理对象的引用
 * 3、代理对象对被代理对象的方法进行增强、过滤、控制、缓存、延迟加载、事务处理、日志记录、权限控制、性能监控、分布式调用、集群调用、负载均衡、容错处理、熔断处理、降级处理、限流处理等
 * <p>
 * 静态代理：代理类和被代理类在编译期间就确定了，代理类是通过实现被代理类的接口或者继承被代理类来实现的
 * 动态代理：代理类和被代理类在运行期间才确定，代理类是通过实现InvocationHandler接口来实现的
 * <p>
 * 设计模式的核心总结：将简单的事情复杂化！从而实现更多的细节、更多的控制、更多的扩展、更多的复用等。虽然这些控制也可以直接写，但是抽离出来后使代码结构更好
 * 本来new Image("test_10mb.jpg").display(); 一行就可以显示一个图片；代理模式现在将其复杂化，在直接操作Image类之前添加一个代理类，
 * 在代理类中完成对象的创建工作、实现了路径判空、日志打印、空对象判断等，还可以添加各类的功能，如缓存、延迟加载、事务处理、权限控制等。
 */
public class ProxyActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_proxy);

        //不使用代理模式，直接简单实现
        Image image = new Image("test_10mb.jpg");
        image.display();

        //使用代理模式实现，新增了代理类ImageProxy，实现了路径判空、日志打印、空对象判断等，虽然这些控制也可以直接写，但是抽离出来后使代码结构更好，功能分类更加清晰
        ImageInterface imageProxy = new ImageProxy("test_10mb.jpg");
        imageProxy.display();

    }
}